package com.gmt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


/**
 * @author John.zhang
 * @version Id: VirtualVmApplication, v 1.0 2020/12/18 17:57 ZhiYong Exp $
 * jvisualvm --打开Java VisualVM
 * -XX:[+/-]  -XX:+UseG1GC 使用G1垃圾回收器
 * -XX:<name>=<value>  -XX:InitialHeapSize=100M 设置堆大小
 * -Xms100M -> -XX:InitialHeapSize=100M
 * -Xmx100M ->
 * -Xss100M ->
 * jps -l 查看当前java进程
 * jinfo -flag UseGiGC/MaxHeapSize 0000  | jinfo -flags 0000 产看某个java进程参数设置情况
 * jstat -class 0000 1000 10  查看某个进程类加载情况每隔1秒打印一次，打印10次
 * jstack 0000 查看当前java进程的堆栈信息(最容易看得出是否有死锁出现)
 * jmap -heap 0000 打印出堆的转存快照
 * jmap -dump:format=b,file=heap.hprof 0000
 * -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof  内存溢出dump文件
 *
 * --工具
 * jconsole
 * jvisualvm
 * arthas
 * mat/perfma (第三方工具)
 * gceasy.io/gcviewer
 *
 * GC调优
 * -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseG1GC -Xloggc:gc.log  打印gc日志 *
 * 可以通过https://gceasy.io分析上面的gc log
 * 或者 java -jar gcviewer-1.36-SNAPSHOT.jar  主要看吞吐量和停顿时间(通过手动设置停顿时间来监控吞吐量)
 *
 * JVM调优指南
 * 1、gc比较频繁：可以通过打印日志分析(通过手动设置停顿时间来监控吞吐量)，适当增加堆内存或者调整gc策略
 * 2、死锁：jstack查看线程堆栈信息，使用zk、redis实现分布式锁
 * 3、OOM：dump出堆文件，使用MAT工具查看，设置本地或者nginx等缓存减少对后端访问
 * 4、线程池不够用：使用jdk自带的jconsole jvisualvm，或者arthas实时查看JVM状态，后端代码优化及时释放资源/合理设置线程持中的参数
 * 5、CPU负载过高：jps jinfo jmap 查看，集群部署或者利用消息中间件MQ Kafka实现消息异步
 */
@SpringBootApplication
public class VirtualVmApplication {

    public static void main(String[] args) {
        SpringApplication.run(VirtualVmApplication.class, args);
    }

}
